package baiqitun.stupro.security.service;

import baiqitun.stupro.common.service.MyService;
import baiqitun.stupro.security.enums.SysRoleEnum;
import baiqitun.stupro.security.entity.SysRole;
import baiqitun.stupro.security.entity.SysUser;
import baiqitun.stupro.security.entity.SysUserRole;

import java.util.List;

/**
 * <p>
 * 用户角色表 服务类
 * </p>
 * 注意这里只保存用户与角色的关系不保存其他附加信息，如姓名、性别、课程等等
 * @author kedaji
 * @since 2020-03-25
 */
public interface SysUserRoleService extends MyService<SysUserRole> {

    /**
     * 重写父类
     * @param userRole
     * @return
     */
    @Override
    boolean save(SysUserRole userRole);
    /**
     * 保存一名管理员
     * @param user 用户信息
     */
    void saveAdministrator(SysUser user);

    /**
     * 为用户授予指定角色的权限
     * @param userId 用户id
     * @param roleCode 角色代码
     * @param createBy 创建人用户名
     */
    void grantRoleForUser(String userId, String roleCode, String createBy);

    /**
     * 获取用户拥有的角色列表
     * @param userId 用户id
     * @return 角色列表
     */
    List<SysRole> listRoleByUserId(String userId);

    /**
     * 获取拥有指定角色的用户
     * @return 用户列表
     */
    List<SysUser> listAdministrator();

    /**
     * 获取所有拥有指定角色的用户
     * @param roleId 角色id
     * @return 用户列表
     */
    List<SysUser> listUserByRoleId(String roleId);

    /**
     * 用户是否拥有角色权限
     * @param userId 用户id
     * @param roleEnum 角色
     * @return true/false
     */
    boolean hasRole(String userId, SysRoleEnum roleEnum);

    /**
     * 检查用户是否具有某角色权限，没有就抛出异常
     * @param userId 用户id
     * @param roleEnum 角色
     */
    void checkUserHasRole(String userId, SysRoleEnum roleEnum);

    /**
     * 用户是否拥有角色权限
     * @param userId 用户id
     * @param roleId 角色id
     * @return 有/没有
     *
     */
    boolean hasRelation(String userId, String roleId);
}
